package basicproxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class BookFacadeProxy implements InvocationHandler {

	private Object target;  
    /** 
     * 绑定委托对象并返回一个代理类 
     * @param target 
     * @return 
     */  
    public Object bind(Object target) {  
        this.target = target;  
        //取得代理对象  
        /*
         * proxy的newProxyInstance方法的javadoc解释说明
         * Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler
         * 翻译过来，即为，对于某个接口产生它的代理类，并且这个类执行任何方法，都会走指定的invocation handler
         */
        //target.getClass().getClassLoader(),“某个实现类”的classloader，如获取BookFacadeImpl的classloader
        //target.getClass().getInterfaces(),“某个实现类”的接口，因为产生的代理类必须实现“某个实现类”的接口，所以这里传入“某个实现类”的接口，如BookFacadeImpl的BookFacade接口
        //this,指定的invocation handler
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
                target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷，cglib弥补了这一缺陷)  
    }  
  
    @Override  
    /** 
     * 调用方法 
     */  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        Object result=null;  
        System.out.println("事物开始");  
        //执行方法  
        result=method.invoke(target, args);  
        System.out.println("事物结束");  
        return result;  
    }  
	

}
